﻿using Controller;
using Microsoft.VisualBasic;
using Model.Entities;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace View
{
    public partial class HorariosView : Form, IHorariosView
    {
        private HorariosController Controller;

        public HorariosView()
        {
            InitializeComponent();

            this.LoadDiasDaSemana();
        }

        public void SetController(HorariosController controller)
        {
            this.Controller = controller;
        }

        #region Dia da semana

        private void LoadDiasDaSemana()
        {
            for (int i = 1; i <= 7; i++)
            {
                string wds = DateAndTime.WeekdayName(i, false, FirstDayOfWeek.Sunday);
                DiaDaSemana ds = new DiaDaSemana();
                ds.Numero = i;
                ds.Nome = wds;
                this.cbxDiaDaSemana.Items.Add(ds);
            }

            this.cbxDiaDaSemana.SelectedIndex = 1;
        }

        #endregion Dia da semana

        #region Origem

        public void ClearCidadesOrigem()
        {
            this.cbxCidadeOrigem.Items.Clear();
        }

        public void AddCidadeOrigem(Cidades cidade)
        {
            this.cbxCidadeOrigem.Items.Add(cidade);
        }

        public void SelectFirstCidadeOrigem()
        {
            try
            {
                this.cbxCidadeOrigem.SelectedIndex = 0;
                this.LoadEstacoesOrigem();
            }
            catch (Exception) { }
        }



        public void ClearEstacoesOrigem()
        {
            this.cbxEstacaoOrigem.Items.Clear();
        }

        public void AddEstacaoOrigem(Estacoes estacao)
        {
            this.cbxEstacaoOrigem.Items.Add(estacao);
        }

        public void SelectFirstEstacaoOrigem()
        {
            try
            {
                this.cbxEstacaoOrigem.SelectedIndex = 0;
            }
            catch (Exception) { }
        }



        private void LoadEstacoesOrigem()
        {
            Cidades selectedCidade = (Cidades)this.cbxCidadeOrigem.SelectedItem;
            if (selectedCidade != null)
            {
                this.Controller.LoadEstacoesOrigem(selectedCidade);
            }
        }

        #endregion Origem

        #region Destino

        public void ClearCidadesDestino()
        {
            this.cbxCidadeDestino.Items.Clear();
        }

        public void AddCidadeDestino(Cidades cidade)
        {
            this.cbxCidadeDestino.Items.Add(cidade);
        }

        public void SelectFirstCidadeDestino()
        {
            try
            {
                this.cbxCidadeDestino.SelectedIndex = 0;
                this.LoadEstacoesDestino();
            }
            catch (Exception) { }
        }



        public void ClearEstacoesDestino()
        {
            this.cbxEstacaoDestino.Items.Clear();
        }

        public void AddEstacaoDestino(Estacoes estacao)
        {
            this.cbxEstacaoDestino.Items.Add(estacao);
        }

        public void SelectFirstEstacaoDestino()
        {
            try
            {
                this.cbxEstacaoDestino.SelectedIndex = 0;
            }
            catch (Exception) { }
        }



        private void LoadEstacoesDestino()
        {
            Cidades selectedCidade = (Cidades)this.cbxCidadeDestino.SelectedItem;
            if (selectedCidade != null)
            {
                this.Controller.LoadEstacoesDestino(selectedCidade);
            }
        }

        #endregion Destino

        #region Horarios

        public void ClearHorarios()
        {
            this.dataGridHorarios.Columns.Clear();
            this.dataGridHorarios.Rows.Clear();
        }

        public void AddHorariosColumns(IList<String> columns)
        {
            foreach (String item in columns)
            {
                this.dataGridHorarios.Columns.Add(item, item);
            }
        }

        public void AddHorarioRow(object[] os)
        {
            int ds = (int)os[os.Length - 2];
            string wds = DateAndTime.WeekdayName(ds, false, FirstDayOfWeek.Sunday);
            os[os.Length - 2] = wds;

            this.dataGridHorarios.Rows.Add(os);
        }

        #endregion Horarios

        private void cbxCidadeOrigem_SelectionChangeCommitted(object sender, EventArgs e)
        {
            this.LoadEstacoesOrigem();
        }

        private void cbxCidadeDestino_SelectionChangeCommitted(object sender, EventArgs e)
        {
            this.LoadEstacoesDestino();
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                Estacoes eo = (Estacoes)this.cbxEstacaoOrigem.SelectedItem;
                Estacoes ed = (Estacoes)this.cbxEstacaoDestino.SelectedItem;

                if (eo.Id == ed.Id)
                {
                    MessageBox.Show(this, "Escolha estações diferentes.", "Horário");
                }
                else
                {
                    DiaDaSemana ds = (DiaDaSemana)this.cbxDiaDaSemana.SelectedItem;
                    long quantidade = this.Controller.LoadHorarios(eo, ed, ds.Numero);
                    if (quantidade <= 0)
                    {
                        MessageBox.Show(this, "Não foram encontrados horários.", "Horário");
                    }
                }
            }
            catch (Exception)
            {
                MessageBox.Show(this, "Os filtros são inválidos para a busca.", "Problemas...");
            }
        }

        private void dataGridHorarios_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                string id = this.dataGridHorarios.Rows[e.RowIndex].Cells[0].Value.ToString();
                MessageBox.Show(String.Format("Horário de código {0} escolhido.", id));
            }
            catch (Exception) { }
        }
    }
}
